package screen.bash;

import java.util.ArrayList;
import java.util.Scanner;

import sql.BancoDados;

import core.Aluno;
import core.Curso;
import core.DocumentoIdentidade;
import core.Endereco;
import core.Pessoa;
import core.Professor;
import core.Turma;

public class Main {
	
	static BancoDados banco;
	
	/**
	 * Metodo principal onde haverá a interação com o usuário. 
	 * @param args
	 */
	public static void main(String[] args) {
		banco = new BancoDados("saw", "itsnotapassword");
		String entrada = "";
		int opcao = 0;
		
		do {
			menu();
			entrada = lerLinha("> ");
			opcao = chooseOption( entrada );
			switch( opcao ) {
			case 1:
				menuAlunos();
				break;
			case 2:
				menuProfessores();
				break;
			case 3:
				menuTurmas();
				break;
			case 4:
				menuCursos();
				break;
			case 5:
				banco.close();
				exitMessage();
				break;
			default:
				ajuda();
				break;
			}
		} while( opcao != 5 );
	}
	
	private static void menuAlunos() {
		String entrada = "";
		int opcao = 0;
		do {
			System.out.println("\n\nMenu ALUNOS:");
			subMenu();
			entrada = lerLinha("> ");
			opcao = chooseSubOption( entrada );
			switch( opcao ) {
			case 1:
				cadastrarAluno();
				break;
			case 2:
				Aluno temp = pesquisarAluno();
				if( temp != null )
					editarAluno( temp );
				break;
			case 3:
				listarAlunos();
				break;
			case 4:
				removerAluno();
				break;
			case 5:
				break;
			default:
				ajuda();
				break;
			}
		} while( opcao != 5 );
	}
	
	private static void menuProfessores() {
		String entrada = "";
		int opcao = 0;
		do {
			System.out.println("\n\nMenu PROFESSORES:");
			subMenu();
			entrada = lerLinha("> ");
			opcao = chooseSubOption( entrada );
			switch( opcao ) {
			case 1:
				cadastrarProfessor();
				break;
			case 2:
				Professor temp = pesquisarProfessor();
				if( temp != null )
					editarProfessor( temp );
				break;
			case 3:
				listarProfessores();
				break;
			case 4:
				removerProfessor();
				break;
			case 5:
				break;
			default:
				ajuda();
				break;
			}
		} while( opcao != 5 );
	}
	
	private static void menuTurmas() {
		String entrada = "";
		int opcao = 0;
		do {
			System.out.println("\n\nMenu TURMAS:");
			subMenu();
			entrada = lerLinha("> ");
			opcao = chooseSubOption( entrada );
			switch( opcao ) {
			case 1:
				cadastrarTurma();
				break;
			case 2:
				Turma temp = pesquisaTurma();
				if( temp != null ) {
					editarTurma( temp );
				}
				break;
			case 3:
				listarTurma();
				break;
			case 4:
				removerTurma();
				break;
			case 5:
				break;
			default:
				ajuda();
				break;
			}
		} while( opcao != 5 );
	}
	
	private static void menuCursos() {
		String entrada = "";
		int opcao = 0;
		do {
			System.out.println("\n\nMenu CURSOS:");
			subMenu();
			entrada = lerLinha("> ");
			opcao = chooseSubOption( entrada );
			switch( opcao ) {
			case 1:
				cadastrarCurso();
				break;
			case 2:
				Curso temp = pesquisaCurso();
				if( temp != null ) {
					editarCurso( temp );
				}
				break;
			case 3:
				listarCurso();
				break;
			case 4:
				removerCurso();
				break;
			case 5:
				break;
			default:
				ajuda();
				break;
			}
		} while( opcao != 5 );
	}
	
	private static Aluno cadastrarAluno() {
		Aluno novoAluno = new Aluno();
		System.out.println("\n\nCadastro de Alunos:");
		novoAluno.setNome( lerLinha("Nome do Aluno: ") );
		novoAluno.setMatricula( lerLinha("Matricula do Aluno: ") );
		if( banco.addAluno(novoAluno) ) {
			System.out.println("Cadastrado com sucesso.");;
		} else {
			System.out.println("Não foi possível efetuar o cadastro, aluno já existente.");
			return null;
		}
		return novoAluno;
	}
	
	private static Aluno pesquisarAluno() {
		System.out.println("\nPesquisa de Aluno:");
		System.out.println("Que tipo de pesquisa deseja fazer?");
		System.out.println("1. Nome");
		System.out.println("2. Matricula");
		System.out.println("3. Voltar");
		String resposta = lerLinha("> ");
		if( (resposta.compareTo("1") == 0) || (resposta.compareToIgnoreCase( "nome" ) == 0) ) {
			System.out.print("Nome do Aluno: ");
			return pesquisarAlunoTipo( "nome" );
		}
		if( (resposta.compareTo("2") == 0) || (resposta.compareToIgnoreCase( "matricula" ) == 0) ) {
			System.out.print( "Matricula do Aluno: ");
			return pesquisarAlunoTipo( "matricula" );
		}
		if( (resposta.compareTo("3") == 0) || (resposta.compareToIgnoreCase( "voltar") == 0) ) {
			return null;
		}
		System.out.println("Opção inválida.");
		return null;
		
	}
	
	private static Aluno pesquisarAlunoTipo( String tipoPesquisa ) {
		ArrayList<Aluno> listaDeAlunos = banco.getPesquisaAluno( tipoPesquisa, lerLinha() );
		System.out.println("Resultado:");
		for( int i = 0; i < listaDeAlunos.size(); i++ ) {
			System.out.println( "Aluno\t" + (i+1) + "\n" + listaDeAlunos.get(i) );
		}
		String resposta = lerLinha( "\nDeseja escolher algum item para edição? (s/n) " );
		if( resposta.compareToIgnoreCase("s") == 0 ) {
			resposta = lerLinha( "Escolha o número do Aluno que deseja editar: " );
			int opcao = Integer.parseInt(resposta);
			if( opcao > 0 || opcao < listaDeAlunos.size() ) {
				return listaDeAlunos.get(opcao - 1);
			}
			System.out.println("Opção inválida.");
		}
		return null;
	}
	
	private static void editarAluno( Aluno alunoOld ) {
		Aluno alunoNovo = new Aluno();
		System.out.println("\nEditar Aluno: ");
		String resposta = lerLinha( "Nome do Aluno [" + alunoOld.getNome() + "] : " );
		if( !resposta.isEmpty() )
			alunoNovo.setNome(resposta);
		else
			alunoNovo.setNome( alunoOld.getNome());
		resposta = lerLinha( "Matricula do Aluno [" + alunoOld.getMatricula() + "] : " );
		if( !resposta.isEmpty() )
			alunoNovo.setMatricula(resposta);
		else
			alunoNovo.setMatricula(alunoOld.getMatricula());
		
		for( int i = 0; i < alunoOld.getMaxQuantidadeCursos(); i++) {
			resposta = "";
			ArrayList<Curso> lstCurso = banco.getArrayCurso();
			if( alunoOld.getCurso(i) == null ) {
				resposta = lerLinha( "Curso do Aluno (? para listar cursos possiveis) [NULL]  : ");
			} else {
				resposta = lerLinha( "Curso do Aluno (? para listar cursos possiveis) [" + alunoOld.getCurso(i).getNome() + "] : ");
			}
			if( resposta.compareTo( "?" ) == 0 ) {
				listarCurso();
				resposta = lerLinha( "Escolha Curso pelo numero da linha: ");
			}
			if( !resposta.isEmpty()) {
				if( Integer.parseInt( resposta ) > 0 && Integer.parseInt( resposta ) <= lstCurso.size() ) {
					if( i < alunoNovo.getQuantidadeCursos() ) {
						alunoNovo.setCurso(i, lstCurso.get( Integer.parseInt(resposta) - 1 ) );
					} else {
						alunoNovo.addCurso( lstCurso.get( Integer.parseInt( resposta ) - 1 ) );
					}
				}
			} else {
				if( i < alunoOld.getQuantidadeCursos() ) {
					alunoNovo.addCurso( alunoOld.getCurso(i) );
				}
			}
		}
		if( banco.overwriteAluno(alunoOld, alunoNovo) )
			System.out.println("Editado com sucesso!");
		else
			System.out.println("Não foi possível concluir a edição.");
	}
	
	private static ArrayList listarAlunos() {
		ArrayList<Aluno> lstAluno = banco.getArrayAluno();
		System.out.println("\nLista de Alunos:");
		for( int i = 0; i < lstAluno.size(); i++ ) {
			System.out.println("\nAluno\t" + (i+1) + "\n" +lstAluno.get(i));
		}
		return lstAluno;
	}
	
	private static void removerAluno() {
		System.out.println("\nRemover Aluno:");
		ArrayList<Aluno> lstAluno = listarAlunos();
		String resposta = lerLinha( "Escolha o aluno que deseja remover: " );
		if( !resposta.isEmpty() ) {
			if( Integer.parseInt( resposta ) > 0 && Integer.parseInt( resposta ) <= lstAluno.size() ) {
				banco.removerAluno( lstAluno.get( Integer.parseInt( resposta ) - 1 ) );
				System.out.println("Removido com sucesso.");
			} else {
				System.out.println("Opção Inválida.");
			}
		} else {
			System.out.println("Opção Inválida.");
		}
	}
	
	private static Professor cadastrarProfessor() {
		System.out.println("\nCadastro de Professores:");
		Professor novoProfessor = new Professor( lerLinha( "Nome do Professor: " ),  lerLinha( "Matricula do Professor: " ) );
		if( banco.addProfessor(novoProfessor)) {
			System.out.println("Cadastrado com sucesso!");
		} else {
			System.out.println("Não foi possível efetuar o cadastro, professor já existente.");
			return null;
		}
		return novoProfessor;
	}
	
	private static Professor pesquisarProfessor() {
		System.out.println("\nPesquisa de Professores:");
		System.out.println("Que tipo de pesquisa deseja fazer?");
		System.out.println("1. Nome");
		System.out.println("2. Matricula");
		System.out.println("3. Voltar");
		String resposta = lerLinha("> ");
		if( (resposta.compareTo("1") == 0) || (resposta.compareToIgnoreCase( "nome" ) == 0) ) {
			System.out.print("Nome do Professor: ");
			return pesquisarProfessorTipo( "nome" );
		}
		if( (resposta.compareTo("2") == 0) || (resposta.compareToIgnoreCase( "matricula" ) == 0) ) {
			System.out.print( "Matricula do Aluno: ");
			return pesquisarProfessorTipo( "matricula" );
		}
		if( (resposta.compareTo("3") == 0) || (resposta.compareToIgnoreCase( "voltar") == 0) ) {
			return null;
		}
		System.out.println("Opção inválida.");
		return null;
	}
	
	private static Professor pesquisarProfessorTipo( String tipoPesquisa ) {
		ArrayList<Professor> lstProfessores = banco.getPesquisaProfessor( tipoPesquisa, lerLinha() );
		System.out.println("Resultado:");
		for( int i = 0; i < lstProfessores.size(); i++ ) {
			System.out.println( "Professor " + (i+1) + "\n" + lstProfessores.get(i) );
		}
		String resposta = lerLinha( "\nDeseja escolher algum item para edição? (s/n) " );
		if( resposta.compareToIgnoreCase("s") == 0 ) {
			resposta = lerLinha( "Escolha o número da linha que deseja editar: " );
			int opcao = Integer.parseInt(resposta);
			if( opcao > 0 && opcao <= lstProfessores.size() ) {
				return lstProfessores.get(opcao - 1);
			}
			System.out.println("Opção inválida.");
		}
		return null;
	}
	
	private static void editarProfessor( Professor professorOld ) {
		System.out.println("\nEditar Professor:");
		Professor professorNew = new Professor();
		String resposta = lerLinha("Nome do Professor [" + professorOld.getNome() + "] : ");
		if( resposta.isEmpty() ) {
			professorNew.setNome( professorOld.getNome() );
		} else {
			professorNew.setNome( resposta );
		}
		resposta = lerLinha("Matricula do Professor [" + professorOld.getMatricula() + "] : ");
		if( resposta.isEmpty() ) {
			professorNew.setMatricula( professorOld.getMatricula() );
		} else {
			professorNew.setMatricula( resposta );
		}
		if( banco.overwriteProfessor( professorOld, professorNew ) )
			System.out.println( "Editado com sucesso." );
		else
			System.out.println( "Não foi possível concluir a edição." );
	}
	
	private static ArrayList listarProfessores() {
		ArrayList<Professor> lstProfessor = banco.getArrayProfessor();
		System.out.println("\nLista de Professores:");
		for( int i = 0; i < lstProfessor.size(); i++ ) {
			System.out.println("\nProfessor\t" + (i+1) + "\n" +lstProfessor.get(i));
		}
		return lstProfessor;
	}
	
	private static void removerProfessor() {
		System.out.println("\nRemover Aluno:");
		ArrayList<Professor> lstProfessor = listarProfessores();
		String resposta = lerLinha( "Escolha o aluno que deseja remover: " );
		if( !resposta.isEmpty() ) {
			if( Integer.parseInt( resposta ) > 0 && Integer.parseInt( resposta ) <= lstProfessor.size() ) {
				banco.removerProfessor( lstProfessor.get( Integer.parseInt( resposta ) - 1 ) );
				System.out.println("Removido com sucesso.");
			} else {
				System.out.println("Opção Inválida.");
			}
		} else {
			System.out.println("Opção Inválida.");
		}
	}
	
	private static Turma cadastrarTurma() {
		
		System.out.println("\n\nCadastro de Turmas:");
		String nomeTurma = lerLinha("Nome da Turma: ");
		System.out.println("Curso vinculado a Turma:");
		ArrayList<Curso> lstCurso = listarCurso();
		int indexLstCurso = 0;
		if( lstCurso.size() < 1 ) {
			System.out.println( "Turma não pode ser cadastrada.\nNão existem cursos cadastrados para vincular a Turma.");
			return null;
		}
		String escolha = lerLinha("Escolha o Curso pelo número da linha: ");
		if( !escolha.isEmpty() ) {
			if( Integer.parseInt(escolha) > 0 && Integer.parseInt(escolha) <= lstCurso.size() ) {
				indexLstCurso = Integer.parseInt( escolha ) - 1;
			} else {
				System.out.println( "Opção inválida.");
				return null;
			}
		} else {
			System.out.println( "Opção inválida.");
			return null;
		}
		System.out.println( lstCurso.get(indexLstCurso) + " teste de curso1 " + lstCurso.size() + " tamanho");
		Turma novaTurma = new Turma( nomeTurma, lstCurso.get(indexLstCurso) );
		System.out.println( novaTurma + " teste de curso2 ");
		
		if( banco.addTurma( novaTurma ) ) {
			System.out.println("Cadastrado com sucesso.");
		} else {
			System.out.println("O cadastro não pode ser efetuado. Turma já existente.");
			return null;
		}
		return novaTurma;
	}
	
	private static Turma pesquisaTurma() {
		System.out.println("\nPesquisa de Turmas:");
		
		ArrayList<Turma> lstTurma = banco.getPesquisaTurma( lerLinha( "Nome da Turma que deseja pesquisar: ") );
		System.out.println("Resultado:");
		for( int i = 0; i < lstTurma.size(); i++ ) {
			System.out.println( "Turma " + (i+1) + "\n" + lstTurma.get(i) );
		}
		String resposta = lerLinha( "\nDeseja escolher algum item para edição? (s/n) " );
		if( resposta.compareToIgnoreCase("s") == 0 ) {
			resposta = lerLinha( "Escolha o número da Turma que deseja editar: " );
			int opcao = Integer.parseInt(resposta);
			if( opcao > 0 && opcao <= lstTurma.size() ) {
				return lstTurma.get(opcao - 1);
			}
			System.out.println("Opção inválida.");
		}
		return null;
	}
	
	private static void editarTurma( Turma turmaOld ) {
		System.out.println("\nEditar Turma:");
		Turma turmaNew = new Turma( turmaOld.getCurso() );
		String resposta = lerLinha("Nome da Turma [" + turmaOld.getNome() + "] : ");
		if( resposta.isEmpty() ) {
			turmaNew.setNome( turmaOld.getNome() );
		} else {
			turmaNew.setNome( resposta );
		}
		if( turmaOld.getProfessor() != null ) {
			System.out.println("Nome do Professor [" + turmaOld.getProfessor().getNome() + "] : ");
		} else {
			System.out.println("Nome do Professor [ NULL ] : ");
		}
		resposta = lerLinha("Deseja mudar o professor da Turma? (s/n) : ");
		if( resposta.compareToIgnoreCase( "s" ) == 0 ) {
			ArrayList<Professor> lstProfessor = listarProfessores();
			resposta = lerLinha("Escolha o professor pelo número: ");
			if( !resposta.isEmpty() ) {
				if( Integer.parseInt(resposta) > 0 && Integer.parseInt(resposta) <= lstProfessor.size() ) {
					turmaNew.setProfessor( lstProfessor.get( Integer.parseInt( resposta ) - 1 ) );
				}
			}
		} else {
			turmaNew.setProfessor( turmaOld.getProfessor() );
		}
		if( banco.overwriteTurma( turmaOld, turmaNew ) ) {
			System.out.println( "Editado com sucesso." );
		} else {
			System.out.println( "Não foi possível concluir a edição." );
		}
	}
	
	private static ArrayList listarTurma() {
		System.out.println("Lista de Turmas:");
		ArrayList<Turma> lstTurma = banco.getArrayTurma();
		for( int i = 0; i < lstTurma.size(); i++ ) {
			System.out.println("Turma " + (i+1) + "\n" + lstTurma.get(i) );
		}
		return lstTurma;
	}
	
	private static void removerTurma() {
		System.out.println("Remover Turma:");
		ArrayList<Turma> lstTurma = listarTurma();
		String resposta = lerLinha("Escolha o número da Turma a ser removido: ");
		if( !resposta.isEmpty() ) {
			if( Integer.parseInt(resposta) > 0 && Integer.parseInt(resposta) <= lstTurma.size() ) {
				banco.removerTurma( lstTurma.get( Integer.parseInt(resposta) - 1 ) );
				System.out.println("Removido com sucesso.");
			} else {
				System.out.println("Opção inválida.");
			}
		} else {
			System.out.println("Opção inválida.");
		}
	}
	
	private static Curso cadastrarCurso() {
		Curso novoCurso = new Curso();
		System.out.println("\n\nCadastro de Cursos:");
		novoCurso.setNome( lerLinha("Nome do Novo Curso: ") );
		novoCurso.setCodigo( lerLinha("Código do Curso: ") );
		banco.addCurso(novoCurso);
		return novoCurso;
	}
	
	private static Curso pesquisaCurso() {
		System.out.println("\n\nPesquisa de Curso:");
		
		ArrayList<Curso> lstCurso = banco.getPesquisaCurso( lerLinha( "Nome do Curso que deseja pesquisar: ") );
		System.out.println("Resultado:");
		for( int i = 0; i < lstCurso.size(); i++ ) {
			System.out.println( "Curso " + (i+1) + "\n" + lstCurso.get(i) );
		}
		String resposta = lerLinha( "\nDeseja escolher algum item para edição? (s/n) " );
		if( resposta.compareToIgnoreCase("s") == 0 ) {
			resposta = lerLinha( "Escolha o número do Curso que deseja editar: " );
			int opcao = Integer.parseInt(resposta);
			if( opcao > 0 && opcao <= lstCurso.size() ) {
				return lstCurso.get(opcao - 1);
			}
			System.out.println("Opção inválida.");
		}
		return null;
	}
	
	private static void editarCurso( Curso cursoOld ) {
		System.out.println("\nEditar Curso:");
		Curso cursoNew = new Curso();
		String resposta = lerLinha("Nome do Curso [" + cursoOld.getNome() + "] : ");
		if( resposta.isEmpty() ) {
			cursoNew.setNome( cursoOld.getNome() );
		} else {
			cursoNew.setNome( resposta );
		}
		resposta = lerLinha("Codigo do Curso [" + cursoOld.getCodigo() + "] : ");
		if( resposta.isEmpty() ) {
			cursoNew.setCodigo( cursoOld.getCodigo() );
		} else {
			cursoNew.setCodigo( resposta );
		}
		if( banco.overwriteCurso( cursoOld, cursoNew ) ) {
			System.out.println( "Editado com sucesso." );
		} else {
			System.out.println( "Não foi possível concluir a edição." );
		}
	}
	
	private static ArrayList listarCurso() {
		ArrayList<Curso> lstCurso = banco.getArrayCurso();
		System.out.println("\nLista de Cursos:");
		for( int i = 0; i < lstCurso.size(); i++ ) {
			System.out.println( "Curso " + (i+1) + "\n" + lstCurso.get(i) );
		}
		return lstCurso;
	}
	
	private static void removerCurso() {
		System.out.println("\nRemover Curso:");
		ArrayList<Curso> lstCurso = listarCurso();
		String resposta = lerLinha( "Escolha o Curso que deseja remover: " );
		if( !resposta.isEmpty() ) {
			if( Integer.parseInt( resposta ) > 0 && Integer.parseInt( resposta ) <= lstCurso.size() ) {
				banco.removerCurso( lstCurso.get( Integer.parseInt( resposta ) - 1 ) );
				System.out.println("Removido com sucesso.");
			} else {
				System.out.println("Opção Inválida.");
			}
		} else {
			System.out.println("Opção Inválida.");
		}
	}
	
	private static int chooseOption( String entrada ) {
		if( (entrada.compareTo( "1" ) == 0) || (entrada.compareToIgnoreCase("alunos") == 0) )
			return 1;
		if( (entrada.compareTo( "2" ) == 0) || (entrada.compareToIgnoreCase("professores") == 0) )
			return 2;
		if( (entrada.compareTo( "3" ) == 0) || (entrada.compareToIgnoreCase("turmas") == 0) )
			return 3;
		if( (entrada.compareTo( "4" ) == 0) || (entrada.compareToIgnoreCase("cursos") == 0) )
			return 4;
		if( (entrada.compareTo( "5" ) == 0) || (entrada.compareToIgnoreCase("sair") == 0) )
			return 5;
		return 0;
	}
	
	private static int chooseSubOption(String entrada) {
		if( (entrada.compareTo( "1" ) == 0) || (entrada.compareToIgnoreCase("cadastrar") == 0) )
			return 1;
		if( (entrada.compareTo( "2" ) == 0) || (entrada.compareToIgnoreCase("pesquisar") == 0) )
			return 2;
		if( (entrada.compareTo( "3" ) == 0) || (entrada.compareToIgnoreCase("listar") == 0) )
			return 3;
		if( (entrada.compareTo( "4" ) == 0) || (entrada.compareToIgnoreCase("remover") == 0) )
			return 4;
		if( (entrada.compareTo( "5" ) == 0) || (entrada.compareToIgnoreCase("voltar") == 0) )
			return 5;
		return 0;
	}
	
	// METODOS PRIVADOS DE MENSAGENS NA TELA DO USUARIO
	
	private static void subMenu() {
		System.out.println("1.\tCadastrar");
		System.out.println("2.\tPesquisar");
		System.out.println("3.\tListar");
		System.out.println("4.\tRemover");
		System.out.println("5.\tVoltar");
	}
	
	private static void menu() {
		System.out.println("\n\nSAW - Sistema Academico Web.");
		System.out.println("\nMenu:");
		System.out.println("1.\tAlunos");
		System.out.println("2.\tProfessores");
		System.out.println("3.\tTurmas");
		System.out.println("4.\tCursos");
		System.out.println("5.\tSair");
	}
	
	private static void ajuda() {
		System.out.println("\n\nAjuda - SAW - Sistema Academico Web");
		System.out.println("\nResponda na linda de prompt \">\" a opção que você deseja escolher.");
		System.out.println("Você pode optar por escolher o número da opção ou digitar a palavra");
		System.out.println("inteira relacionada a sua escolha.");
		System.out.println("\nPor exemplo, se você quer entrar na opção referente aos cursos.");
		System.out.println("Você pode digitar a opção \"4\".");
		System.out.println("ou você pode digitar a palavra inteira desta opção, \"cursos\".");
		System.out.println();
	}
	
	private static void exitMessage() {
		System.out.println("\n\nObrigado por utilizar o SAW - Sistema Academico Web.");
	}
	
	// METODO DE LEITURA DO TECLADO
	private static String lerLinha( String mensagem ) {
		String leitura = "";
		System.out.print( mensagem );
		Scanner sc = new Scanner( System.in );
		leitura = sc.nextLine();
//		sc.close();
		return leitura;
	}
	
	private static String lerLinha() {
		String leitura = "";
		Scanner sc = new Scanner( System.in );
		leitura = sc.nextLine();
//		sc.close();
		return leitura;
	}
}
